#include <iostream>
#include <algorithm>
#include <cstdio>
#include <array>
#define ll long long
using namespace std;
#ifdef ONLINE_JUDGE

//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
//char buf[1 << 23], *p1 = buf, *p2 = buf, ubuf[1 << 23], *u = ubuf;

#endif
int read() {
	int p = 0, flg = 1;
	char c = getchar();
	while (c < '0' || c > '9') {
		if (c == '-') flg = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9') {
		p = p * 10 + c - '0';
		c = getchar();
	}
	return p * flg;
}
void write(int x) {
	if (x < 0) {
		x = -x;
		putchar('-');
	}
	if (x > 9) {
		write(x / 10);
	}
	putchar(x % 10 + '0');
}
bool _stmer;

const ll N = 1e7 + 5, inf = 1e18, mod = 1e9 + 7;

array <ll, N> s, f;

bool _edmer;
int main() {
	cerr << (&_stmer - &_edmer) / 1024.0 / 1024.0 << "MB\n";
#ifndef cxqghzj
	freopen("knight.in", "r", stdin);
	freopen("knight.out", "w", stdout);
#endif
	int n = read(), k = read();
	for (int i = 1; i <= n; i++)
		s[i] = read();
	f.fill(inf);
	if (n <= 2000) {
		f[0] = 0;
		for (int i = 1; i <= n; i++) {
			ll res = s[i];
			for (int j = i; j >= max(i - k + 1, 1); j--) {
				res = max(res, s[j]);
				f[i] = min(f[i], f[j - 1] + res);
			}
		}
	}
	else {
		for (int i = 1; i <= n; i++) {
			int pos = max(i - k + 1, 1);
			f[i] = min(f[i], f[pos - 1] + s[i]);
		}
	}
	for (int i = 1; i <= n; i++)
		cerr << f[i] << " ";
	cerr << endl;
	ll ans = 0, idx = 1;
	for (int i = n; i >= 1; i--) {
		ans += idx * f[i] % mod;
		if (ans >= mod) ans -= mod;
		idx = idx * 23ll % mod;
	}
	write(ans), puts("");
	return 0;
}
